package questionmanager;

import gui.CustomJButton;
import gui.GUIMain;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import rmi.Question;
import structure.QuestionType;

public class GUIQuestionManagerLeft extends JPanel{
	
	private static final long serialVersionUID = 1L;
	private GUIQuestionManager parent;
	private GUIQuestionTypeDisplay display;
	private CustomJButton addButton;
	private JPopupMenu menu;
	private int currentClickedRow;
	
	public GUIQuestionManagerLeft(GUIQuestionManager parent) {
		this.parent = parent;
		setOpaque(false);
		setLayout(new BorderLayout());
		setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10));
		display = new GUIQuestionTypeDisplay();
		createPopupMenu();
		
		JPanel bottomPanel;
		bottomPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
		bottomPanel.setOpaque(false);
		addButton = new CustomJButton("Thêm", 100, 30, Color.WHITE, CustomJButton.DARKER,
				Color.darkGray, 2, false, true);
		
		addButton.addActionListener(new AddQuestionTypeAction());
		bottomPanel.add(addButton);
		add(bottomPanel, BorderLayout.SOUTH);
		
		display.getJList().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
		display.getJList().addListSelectionListener(new QuestionTypeSelectionListener());
		display.getJList().addMouseListener(new QuestionTypeMouseListener());
		add(display,BorderLayout.CENTER);
		display.getQuestionTypeFromDB();
	}
	
	public void refresh(){
		display.getQuestionTypeFromDB();
	}
	
	private void createPopupMenu(){
		menu  = new JPopupMenu();
		JMenuItem menuItem;
		menuItem = new JMenuItem("Chỉnh sửa...");
		menuItem.addActionListener(new QuestionTypeEdit());
		menu.add(menuItem);
		
		menuItem = new JMenuItem("Xoá");
		menuItem.addActionListener(new QuestionTypeDelete());
		menu.add(menuItem);
	}
	
	class QuestionTypeDelete extends AbstractAction{

		private static final long serialVersionUID = 1L;
		
		@Override
		public void actionPerformed(ActionEvent e) {
			QuestionType ex = (QuestionType) display.getJList().getModel().getElementAt(currentClickedRow);
			Object[] options = {"Có",
                    "Không"};
			String content = "Bạn thực sự muốn xoá loại câu hỏi '" + ex.gettName() +"' ? \nChú ý: Khi xoá một Loại câu hỏi" +
                    " tất cả các câu hỏi có trong loại câu hỏi đó cũng sẽ bị xoá!";
			int n = JOptionPane.showOptionDialog(parent,
				    content,
				    "Chú ý",
				    JOptionPane.YES_NO_OPTION,
				    JOptionPane.QUESTION_MESSAGE,
				    null,
				    options,
				    options);
			if(n == JOptionPane.YES_OPTION){
				try {
					ArrayList<Question> array = GUIMain.getDb().getQuestionsByType(ex.gettID());
					boolean canDelete = true;
					for(Question count :  array){
						if(!GUIMain.getDb().CheckIfQuestionRemovable(count.getQuestionID())){
							canDelete = false;
							break;
						}
					}
					if(canDelete){
						if(GUIMain.getDb().DeleteQuestionByType(ex.gettID())){
							if(GUIMain.getDb().DeleteQuestionType(ex.gettID())){
								JOptionPane.showMessageDialog(parent, "Thao tác xoá loại câu hỏi thành công", 
									"Thông báo", JOptionPane.INFORMATION_MESSAGE);
								}
							else{
								JOptionPane.showMessageDialog(parent, "Thao tác xoá loại câu hỏi không thành công", 
										"Thông báo", JOptionPane.ERROR_MESSAGE);
							}
						}else{
							JOptionPane.showMessageDialog(parent, "Thao tác xoá các câu hỏi có trong loại câu hỏi không thành công", 
									"Thông báo",JOptionPane.ERROR_MESSAGE);
						
						}
						display.getQuestionTypeFromDB();
						display.getJList().clearSelection();
						parent.getRightPanel().refresh(null);
					}else{
						JOptionPane.showMessageDialog(parent,
								"Không thể xoá Loại câu hỏi vì nó có chứa câu hỏi đã được sử dụng bởi đề thi.", 
								"Thông báo", JOptionPane.INFORMATION_MESSAGE);
					}
				} catch (SQLException e1) {
					e1.printStackTrace();
				}
			}
		}
	}
	
	class AddQuestionTypeAction extends AbstractAction{

		private static final long serialVersionUID = 1L;

		@Override
		public void actionPerformed(ActionEvent arg0) {
			boolean notDone = true;
			do{
				String temp = JOptionPane.showInputDialog(parent, "Tên Loại câu hỏi: ",
						"Loại câu hỏi mới", JOptionPane.INFORMATION_MESSAGE);
				if(temp == null) return;
				if(temp.trim().equals("")){
					JOptionPane.showMessageDialog(parent, 
							"Tên loại câu hỏi không được trống", 
							"Thông báo", JOptionPane.ERROR_MESSAGE);
					continue;
				}else{
					if(GUIMain.getDb().InsertQuestionType(temp.trim())){
						JOptionPane.showMessageDialog(parent, 
								"Tạo mới loại câu hỏi thành công", 
								"Thông báo", JOptionPane.INFORMATION_MESSAGE);
					}else{
						JOptionPane.showMessageDialog(parent,
								"Tạo mới loại câu hỏi không thành công", 
								"Thông báo", JOptionPane.ERROR_MESSAGE);
					}
					notDone = false;
					display.getQuestionTypeFromDB();
				}
			}while(notDone);
		}
	}

	class QuestionTypeEdit extends AbstractAction{
		
		private static final long serialVersionUID = 1L;
		
		@Override
		public void actionPerformed(ActionEvent e) {
			boolean temp = true;
			QuestionType ex = display.getDisplayModel().getDisplayCollection().get(currentClickedRow);
			do{
				String newName = JOptionPane.showInputDialog(parent, "Tên mới :", 
						"Tên loại câu hỏi", JOptionPane.INFORMATION_MESSAGE);
				if(newName==null){
					temp = false;
					continue;
				}else{
					newName = newName.trim();
				}
				if(newName.equals("")){
					JOptionPane.showMessageDialog(parent, 
							"Tên loại câu hỏi không được để trống.", 
							"Thông báo", JOptionPane.ERROR_MESSAGE);
				}else if(newName.equals(ex.gettName())){
					JOptionPane.showMessageDialog(parent, 
							"Tên loại câu hỏi giống với tên loại câu hỏi đã có trước đó.", 
							"Thông báo", JOptionPane.ERROR_MESSAGE);
				}else{
					if(GUIMain.getDb().UpdateQuestionType(ex.gettID(), newName)){
						JOptionPane.showMessageDialog(parent, "Cập nhật loại câu hỏi thành công", 
								"Thông báo", JOptionPane.INFORMATION_MESSAGE);
						
					}else{
						JOptionPane.showMessageDialog(parent, "Cập nhật loại câu hỏi không thành công", 
								"Thông báo", JOptionPane.ERROR_MESSAGE);
					}
					temp = false;
				}
			}while(temp);	
			display.getQuestionTypeFromDB();
		}
	}
	
	class QuestionTypeMouseListener extends MouseAdapter{

		@Override
		public void mouseClicked(MouseEvent e) {
			switch(e.getModifiers()) {
				case InputEvent.BUTTON1_MASK: {  
					super.mouseClicked(e);	
					break;
		        }
				case InputEvent.BUTTON2_MASK: {    
					break;
		        }
				case InputEvent.BUTTON3_MASK: {
					int temp = display.getJList().locationToIndex(e.getPoint());
					if(temp == -1) return;
			        currentClickedRow = temp;
			        menu.show(e.getComponent(), e.getX(), e.getY());
			        break;
		        }
			}
		}
	}
	
	class QuestionTypeSelectionListener implements ListSelectionListener{
		
		@Override
		public void valueChanged(ListSelectionEvent e) {
			if(!e.getValueIsAdjusting()){
				List<QuestionType> array = display.getJList().getSelectedValuesList();
				int[] temp = new int[array.size()];
				for(int i = 0; i<array.size(); i++){
					temp[i] = array.get(i).gettID();
				}
				parent.getRightPanel().refresh(temp);
			}
		}
	}
}
